PlantUML 中文字体设置:skinparam 与 style 两种写法
用 PlantUML 画带中文的时序图、类图,渲染出来全是乱码或方块(tofu),是最常遇到的问题之一。原因和解决办法都不复杂:PlantUML 默认字体不含中文字形,需要显式指定一个渲染环境已安装的中文字体。这篇文章给出新旧两种写法,以及排查仍然乱码的思路。
判定问题
先明确两点前提:
- PlantUML 不会自动选择中文字体,未指定时中文按默认字体渲染,缺字形就是方块;
- 指定的字体名必须与系统已安装字体的名称完全一致。访问 plantuml.com/font 可以列出当前环境可用的字体名,从里面复制最稳妥。
写法一:skinparam defaultFontName
经典写法,在图定义开头加一行:
plantuml
@startuml
skinparam defaultFontName Noto Sans CJK SC
Client -> Gateway : 提交订单{编号、数量}
Gateway -> Service : 创建订单
note right of Service
校验参数合法性
写入存储
更新订单状态
end note
Service -> Gateway : 成功/失败
Gateway -> Client : 成功/失败
@enduml 常用中文字体名:
| 系统 | 字体名 |
|---|---|
| Linux | Noto Sans CJK SC(黑体)、Noto Serif CJK SC(宋体) |
| Windows | Microsoft YaHei、SimSun |
注意 Noto 系列的后缀区分字形区域:SC 简体中文,TC 台湾繁体,HK 香港繁体,按需选择。
写法二:style(新版推荐)
skinparam 正被逐步淘汰,新版 PlantUML 推荐用 CSS 风格的 <style> 块:
plantuml
@startuml
<style>
document {
FontName Noto Sans CJK SC
}
</style>
@enduml 两种写法效果等价,新项目建议直接用 <style>;存量图里的 skinparam 暂时仍可正常工作。
还是乱码:环境缺字体
本机正常、服务器渲染乱码,基本是服务器环境没有中文字体。Linux 服务器安装 Noto CJK 字体包后再渲染:
bash
sudo apt install fonts-noto-cjk 这也是 CI 流水线里生成 PlantUML 图片出现方块的常见原因——基础镜像通常不带中文字体。
小结
PlantUML 中文乱码三步排查:确认指定了中文字体(skinparam defaultFontName 或 <style> 的 FontName);字体名与系统安装的完全一致(plantuml.com/font 查询);渲染环境确实装了该字体(服务器装 fonts-noto-cjk)。